package queue;

import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 学习 ConcurrentLinkedQueue
 * 
 * 同步队列:
 * 1. 阻塞: 一把 / 两把锁
 * 2. 非阻塞: 循环 CAS
 * 
 * @author insight
 * @since 2021/9/24
 */
public class CLQTest {
    public static void main(String[] args) {
        // 底层是链表 初始化头尾节点
        ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();

        // 加入链表尾部
        // 先获取尾节点 如果tail.next == null 尝试CAS插入
        // 如果 tail 发生变化 重新获取tail
        // 如果 tail.next 不为空 则移动当前节点
        queue.offer(1);
        // 从头节点获取
        // 如果头节点有值 CAS 成功 且当前节点还是头节点 则返回
        // 如果不是头节点 则设置head.next
        // 如果 head.next == null 重新设置头节点
        queue.poll();
    }
}